#include	<pic.h>
#include	"lcd1.h"
#include	"delay1.h"

#define LCD_RS	RA2	// Register select
#define LCD_EN	RA3	// Enable
#define LCD_D4	RB0	// Data bits
#define LCD_D5	RB1	// Data bits
#define LCD_D6	RB2	// Data bits
#define LCD_D7	RB3	// Data bits

#define	LCD_STROBE	((LCD_EN = 1),(LCD_EN=0))

/***************************************/
/*Write a byte to the LCD in 4 bit mode*/
/***************************************/
void
lcd_write(unsigned char c)
{
	if(c & 0x80) LCD_D7=1; else LCD_D7=0;
	if(c & 0x40) LCD_D6=1; else LCD_D6=0;
	if(c & 0x20) LCD_D5=1; else LCD_D5=0;
	if(c & 0x10) LCD_D4=1; else LCD_D4=0;
	LCD_STROBE;
	if(c & 0x08) LCD_D7=1; else LCD_D7=0;
	if(c & 0x04) LCD_D6=1; else LCD_D6=0;
	if(c & 0x02) LCD_D5=1; else LCD_D5=0;
	if(c & 0x01) LCD_D4=1; else LCD_D4=0;
	LCD_STROBE;
	DelayUs(40);
}


/******************************/
/*   Clear and home the LCD   */
/******************************/
void
lcd_clear(void)
{
	LCD_RS = 0;
	lcd_write(0x1);
	DelayMs(2);
}


/**************************************/
/* Write a string of chars to the LCD */
/**************************************/
void
lcd_puts(const char * s)
{
	LCD_RS = 1;	// write characters
	while(*s) lcd_write(*s++);
}


/**********************************/
/* Write one character to the LCD */
/**********************************/
void
lcd_putch(unsigned char c)
{
	LCD_RS = 1;	// write characters
	lcd_write(c);
}


/********************************/
/* Go to the specified position */
/********************************/
void
lcd_goto(unsigned char pos)
{
	LCD_RS = 0;
	lcd_write(0x80 + pos);
}


/********************************************/
/* Initialise the LCD - put into 4 bit mode */
/********************************************/
void
lcd_init(void)
{
	LCD_RS = 0;		// write control bytes
	DelayMs(15);		// power on delay
	LCD_D4 = 1;		// init!
	LCD_D5 = 1; 		//
	LCD_STROBE;
	DelayMs(5);
	LCD_STROBE;		// init!
	DelayUs(100);
	LCD_STROBE;		// init!
	DelayMs(5);
	LCD_D4 = 0;		// set 4 bit mode
	LCD_STROBE;
	DelayUs(40);
	lcd_write(0x28);	// 4 bit mode, 1/16 duty, 5x8 font, 2lines
	lcd_write(0x0C);	// display on
	lcd_write(0x06);	// entry mode advance cursor
	lcd_write(0x01);	// clear display and reset cursor
}
